using System;

namespace DDW
{
	public enum TokenID : byte
	{
		Whitespace		= 0x00,
		Newline			= 0x01,
		SingleComment	= 0x02,
		MultiComment	= 0x03,
		DocComment		= 0x04,

		Ident			= 0x05,
		TrueLiteral		= 0x06,
		FalseLiteral	= 0x07,
		NullLiteral		= 0x08,

		//SByteLiteral	= 0x09, // not used
		//ByteLiteral	= 0x0A,
		//ShortLiteral	= 0x0B,
		//UShortLiteral	= 0x0C,
		HexLiteral		= 0x0C,
		IntLiteral		= 0x0D,
		UIntLiteral		= 0x0F,
		LongLiteral		= 0x10,
		ULongLiteral	= 0x11,

		DecimalLiteral	= 0x12,
		RealLiteral		= 0x13,

		CharLiteral		= 0x14,
		StringLiteral	= 0x15,

		ColonColon		= 0x1F, // "??" 
		QuestionQuestion= 0x20, // "::" 

		Not				= (int)'!', // 0x21
		Quote			= (int)'"', // 0x22
		Hash			= (int)'#', // 0x23
		Dollar			= (int)'$', // 0x24
		Percent			= (int)'%', // 0x25
		BAnd			= (int)'&', // 0x26
		SQuote			= (int)'\'', // 0x27
		LParen			= (int)'(', // 0x28
		RParen			= (int)')', // 0x29
		Star			= (int)'*', // 0x2A
		Plus			= (int)'+', // 0x2Bz 
		Comma			= (int)',', // 0x2C
		Minus			= (int)'-', // 0x2D
		Dot				= (int)'.', // 0x2E
		Slash			= (int)'/', // 0x2F

		PlusPlus		= 0x30, // "++"
		MinusMinus		= 0x31, // "--"
		And				= 0x32, // "&&"
		Or				= 0x33, // "||"
		MinusGreater	= 0x34, // "->"
		EqualEqual		= 0x35, // "=="
		NotEqual		= 0x36, // "!="
		LessEqual		= 0x37, // "<="
		GreaterEqual	= 0x38, // ">="
		PlusEqual		= 0x39, // "+="

		Colon			= (int)':', // 0x3A
		Semi			= (int)';', // 0x3B
		Less			= (int)'<', // 0x3C
		Equal			= (int)'=', // 0x3D
		Greater			= (int)'>', // 0x3E
		Question		= (int)'?', // 0x3F
		//At				= (int)'@', // 0x40

		MinusEqual		= 0x41, // "-="
		StarEqual		= 0x42, // "*="
		SlashEqual		= 0x43, // "/="
		PercentEqual	= 0x44, // "%="
		BAndEqual		= 0x45, // "&="
		BOrEqual		= 0x46, // "|="
		BXorEqual		= 0x47, // "^="
		ShiftLeft		= 0x48, // "<<"
		ShiftLeftEqual	= 0x49, // "<<="
		ShiftRight		= 0x4A, // ">>"
		ShiftRightEqual	= 0x4B, // ">>="
		
		Byte			= 0x4C, // "byte"
		Bool			= 0x4D, // "bool"
		Char			= 0x4E, // "char"
		Double			= 0x4F, // "double"
		Decimal			= 0x50, // "decimal"
		Float			= 0x51, // "float"
		Int				= 0x52, // "int"
		Long			= 0x53, // "long"
		Object			= 0x54, // "object"
		SByte			= 0x55, // "sbyte"
		String			= 0x56, // "string"
		Short			= 0x57, // "short"
		UShort			= 0x58, // "ushort"
		ULong			= 0x59, // "ulong"
		UInt			= 0x5A, // "uint"

		LBracket		= (int)'[', // 0x5B
		BSlash			= (int)'\\', // 0x5C
		RBracket		= (int)']', // 0x5D
		BXor			= (int)'^', // 0x5E
									//'_', 0x5F
		BSQuote			= (int)'`', // 0x60

		Abstract		= 0x61, // "abstract"
		Const			= 0x62, // "const"
		Extern			= 0x63, // "extern"
		Explicit		= 0x64, // "explicit"
		Implicit		= 0x65, // "implicit"
		Internal		= 0x66, // "internal"
		New				= 0x67, // "new"
		Out				= 0x68, // "out"
		Override		= 0x69, // "override"
		Private			= 0x6A, // "private"
		Public			= 0x6B, // "public"
		Protected		= 0x6C, // "protected"
		Ref				= 0x6D, // "ref"
		Readonly		= 0x6E, // "readonly"
		Static			= 0x6F, // "static"
		Sealed			= 0x70, // "sealed"
		Volatile		= 0x71, // "volatile"
		Virtual			= 0x72, // "virtual"
		Class			= 0x73, // "class"
		Delegate		= 0x74, // "delegate"
		Enum			= 0x75, // "enum"
		Interface		= 0x76, // "interface"
		Struct			= 0x77, // "struct"
		As				= 0x78, // "as"
		Base			= 0x79, // "base"
		Break			= 0x7A, // "break"

		LCurly			= (int)'{', // 0x7B
		BOr				= (int)'|', // 0x7C
		RCurly			= (int)'}', // 0x7D
		Tilde			= (int)'~', // 0x7E

		Catch			= 0x7F, // "catch"
		Continue		= 0x80, // "continue"
		Case			= 0x81, // "case"
		Do				= 0x82, // "do"
		Default			= 0x83, // "default"
		Else			= 0x84, // "else"
		For				= 0x85, // "for"
		Foreach			= 0x86, // "foreach"
		Finally			= 0x87, // "finally"
		Fixed			= 0x88, // "fixed"
		Goto			= 0x89, // "goto"
		If				= 0x8A, // "if"
		In				= 0x8B, // "in"
		Is				= 0x8C, // "is"
		Lock			= 0x8D, // "lock"
		Return			= 0x8E, // "return"
		Stackalloc		= 0x8F, // "stackalloc"
		Switch			= 0x90, // "switch"
		Sizeof			= 0x91, // "sizeof"
		Throw			= 0x92, // "throw"
		Try				= 0x93, // "try"
		Typeof			= 0x94, // "typeof"
		This			= 0x95, // "this"
		Void			= 0x96, // "void"
		While			= 0x97, // "while"
		Checked			= 0x98, // "checked"
		Event			= 0x99, // "event"
		Namespace		= 0x9A, // "namespace"
		Operator		= 0x9B, // "operator"
		Params			= 0x9C, // "params"
		Unsafe			= 0x9D, // "unsafe"
		Unchecked		= 0x9E, // "unchecked"
		Using			= 0x9F, // "using"
		
		// (not keywords)

		Assembly 		= 0xA0, // "assembly" 
		Property		= 0xA1, // "property"
		Method			= 0xA2, // "method"
		Field			= 0xA3, // "field"
		Param			= 0xA4, // "param"
		Type 			= 0xA5, // "type"

		PpDefine		= 0xE0, // preproc Define
		PpUndefine		= 0xE1, // preproc Undefine
		PpIf			= 0xE2, // preproc If
		PpElif			= 0xE3, // preproc Elif
		PpElse			= 0xE4, // preproc Else
		PpEndif			= 0xE5, // preproc Endif
		PpLine			= 0xE6, // preproc Line
		PpError			= 0xE7, // preproc Error
		PpWarning		= 0xE8, // preproc Warning
		PpRegion		= 0xE9, // preproc Region
		PpEndregion		= 0xEA, // preproc Endregion
		PpPragma		= 0xEB, // preproc Pragma

		Eof				= 0xFE, // error token
		Invalid			= 0xFF, // error token

	}
}
